table of contents
READ(2) | Руководство программиста Linux | READ(2) |
ИМЯ¶
read - читает из файлового дескриптора
ОБЗОР¶
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);
ОПИСАНИЕ¶
read() пытается прочитать count байт из файлового дескриптора fd в буфер, начинающийся по адресу buf.
Если значение count равно нулю, то read() возвращает ноль и ничего не делает. Еслиcount больше чем SSIZE_MAX, то результат не определён.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении возвращается количество прочитанных байт (ноль означает конец файла), а позиция в файле увеличивается на это значение. Если количество прочитанных байт меньше, чем количество запрошенных, то это не считается ошибкой: например, это могло произойти из-за того, что прямо сейчас доступно меньшее количество байт (может быть из-за того, что позиция ближе к концу файла, или потому что выполняется чтение из канала или терминала), или потому что работа read() была прервана сигналом. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение. В этом случае изменение позиции файла остаётся неопределённым (если это вообще происходило).
ОШИБКИ¶
- EAGAIN
- Файловый дескриптор fd указывает на файл, не являющийся сокетом и который помечен как неблокирующий (O_NONBLOCK), а чтение вызвало бы блокировку.
- EAGAIN или EWOULDBLOCK
- Файловый дескриптор fd указывает на сокет и он помечен как неблокирующий (O_NONBLOCK), а чтение вызвало бы блокировку. POSIX.1-2001 позволяет вернуть любую ошибку в этом случае и не требует, чтобы эти константы имели одинаковое значение, поэтому переносимое приложение должно проверять обе эти возможности.
- EBADF
- fd не является допустимым файловым дескриптором или не открыт на чтение.
- EFAULT
- buf находится за пределами доступного вам адресного пространства.
- EINTR
- Вызов был прерван сигналом до того как были прочитаны данные; см. signal(7).
- EINVAL
- fd связан с объектом, не приспособленным для чтения; илифайл был открыт с использованием флага O_DIRECT, и адрес, указанный в buf, значение, указанное в count или текущее смещение в файле, имеет недопустимое выравнивание.
- EINVAL
- fd был создан вызовом timerfd_create(2), а в read() был передан неверный размер буфера; подробней см. в timerfd_create(2).
- EIO
- Ошибка ввода/вывода. Например, это происходит когда процесс, находящийся в фоновой группе процессов, пытается выполнить чтение из своего управляющего tty, и игнорирует или блокирует сигнал SIGTTIN или же его группа процессов осталась без родителя. Это также может случиться, если произошла низкоуровневая ошибка ввода-вывода при чтения с диска или ленты.
- EISDIR
- fd указывает на каталог.
Могут также возникнуть другие ошибки, в зависимости от объекта, связанного с fd. POSIX позволяет системному вызову read(), который был прерван после чтения первого куска запрошенных данных, возвращать -1 (с errno, установленной в EINTR) или количество уже прочитанных байт.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
SVr4, 4.3BSD, POSIX.1-2001.
ЗАМЕЧАНИЯ¶
На файловых системах NFS чтение небольших порций данных обновляет отметки времени только в первый раз, последующие вызовы не делают этого. Это вызвано кэшированием атрибутов с клиентской стороны, потому что большинство (если не все) клиентов NFS предоставляют серверу обновлять st_atime (время последнего доступа), а запросы на чтение, которые удовлетворяются из клиентского кэша, не вызывают обновления st_atime, потому что данные не читаются с сервера. Семантика UNIX может быть достигнута запретом кэширования атрибутов на стороне клиента, но в большинстве случаев это увеличит нагрузку на сервер и снизит производительность.
Многие файловые системы и диски рассматриваются как достаточно быстрые и реализацию O_NONBLOCK считают ненужной. Поэтому O_NONBLOCK может быть недоступен на файлах и/или дисках.
СМОТРИТЕ ТАКЖЕ¶
close(2), fcntl(2), ioctl(2), lseek(2), open(2), pread(2), readdir(2), readlink(2), readv(2), select(2), write(2), fread(3)
2009-02-23 | Linux |